package com.fyl.leetcode.binarySearch;

/**
 * @author:fyl
 * @date 2021/5/12 20:30
 * @Modified By:
 * @Modified Date:
 * @Description:
 * 给定一个只包含整数的有序数组，每个元素都会出现两次，唯有一个数只会出现一次，找出这个数。
 * Input: [1, 1, 2, 3, 3, 4, 4, 8, 8]
 * Output: 2
 * 令 index 为 Single Element 在数组中的位置。在 index 之后，数组中原来存在的成对状态被改变。
 * 如果 m 为偶数，并且 m + 1 < index，那么 nums[m] == nums[m + 1]；m + 1 >= index，那么 nums[m] != nums[m + 1]。
 *
 * 从上面的规律可以知道，如果 nums[m] == nums[m + 1]，那么 index 所在的数组位置为 [m + 2, h]，此时令 l = m + 2；
 * 如果 nums[m] != nums[m + 1]，那么 index 所在的数组位置为 [l, m]，此时令 h = m。
 *
 * 因为 h 的赋值表达式为 h = m，那么循环条件也就只能使用 l < h 这种形式。
 */
public class SingleNonDuplicate {
    public int singleNonDuplicate(int[] nums) {
        int low = 0;
        int high = nums.length-1;
        while (low < high) {
            int mid = low + ((high - low) >> 1);
            if (mid % 2 == 1) {
                mid--;
            }
            if (nums[mid]==nums[mid+1]){
                low = mid+2;
            }else {
                high = mid;
            }
        }
        return nums[low];
    }
}
